package gu.jimgutil;

public abstract class BaseImageCvt {

	protected BaseImageCvt() {
	}
	/**
	 * 将输入图像的色彩空间RGBA转为BGR，输出到output
	 * @param input 输入图像矩阵RGBA,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*4
	 * @param output [out] 输出图像,size=width*height*3
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void RGBA2BGR(byte[] input,int width,int height,int stride,byte[] output) ;
	/**
	 * 将输入图像的色彩空间RGBA转为RGB，输出到output
	 * @param input 输入图像矩阵RGBA,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*4
	 * @param output [out] 输出图像,size=width*height*3
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void RGBA2RGB(byte[] input,int width,int height,int stride,byte[] output) ;
	/**
	 * 将输入图像的色彩空间RGBA转为灰度，输出到output
	 * @param input 输入图像矩阵RGBA,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*4
	 * @param output [out] 输出图像,size=width*height
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void RGBA2GRAY(byte[] input,int width,int height,int stride,byte[] output) ;
	/**
	 * 将输入图像的色彩空间RGB转为BGR，输出到output
	 * @param input 输入图像矩阵RGBA,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*3
	 * @param output [out] 输出图像,size=width*height*3
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void RGB2BGR(byte[] input,int width,int height,int stride,byte[] output);
	/**
	 * 将输入图像的3字节色彩空间(RGB/BGR)反序转换
	 * @param input 输入图像矩阵(RGB/BGR),size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*3
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void swap3byte(byte[] input,int width,int height,int stride) ;
	/**
	 * 将输入图像的色彩空间RGB转为灰度，输出到output
	 * @param input 输入图像矩阵RGB,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*3
	 * @param output [out] 输出图像,size=width*height
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void RGB2GRAY(byte[] input,int width,int height,int stride,byte[] output) ;
	/**
	 * 将输入图像的色彩空间BGR转为RGBA，输出到output
	 * @param input 输入图像矩阵BGR,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*3
	 * @param output [out] 输出图像,size=width*height*4
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void BGR2RGBA(byte[] input,int width,int height,int stride,byte[] output);
	/**
	 * 将输入图像的色彩空间RGB转为RGBA，输出到output
	 * @param input 输入图像矩阵RGB,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*3
	 * @param output [out] 输出图像,size=width*height*4
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void RGB2RGBA(byte[] input,int width,int height,int stride,byte[] output) ;
/**
	 * 将输入图像 顺时针原地旋转(In-place matrix transposition)指定的角度<br>
	 * 图像必须是1字节对齐，多字节对齐的图像旋转可能会造成图像错位
	 * @param input 输入图像矩阵,size=width*height*bpp
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param bpp 每像素字节数(1,2,3,4)
	 * @param angle 顺时针旋转角度(0,90,180,270)
	 * @throws NullPointerException
	 * @throws IllegalArgumentException
	 */
	abstract void rotate(byte[] input,int width,int height,int bpp,int angle);
	/**
	 * 图像水平原地翻转(In-place)<br>
	 * 图像必须是1字节对齐，多字节对齐的图像旋转可能会造成图像错位
	 * @param input 输入图像矩阵,size=width*height*bpp
	 * @param width
	 * @param height
	 * @param bpp 每像素字节数(1,2,3,4)
	 * @throws NullPointerException
	 * @throws IllegalArgumentException
	 */
	abstract void hflip(byte[] input,int width,int height,int bpp);

	/**
	 * 图像垂直原地翻转(In-place)<br>
	 * 图像必须是1字节对齐，多字节对齐的图像旋转可能会造成图像错位
	 * @param input 输入图像矩阵,size=width*height*bpp
	 * @param width
	 * @param height
	 * @param bpp 每像素字节数(1,2,3,4)
	 * @throws NullPointerException
	 * @throws IllegalArgumentException
	 */
	abstract void vflip(byte[] input,int width,int height,int bpp) ;

	/**
	 * 将输入图像的色彩空间NV21转为RGB，输出到output
	 * @param input 输入图像矩阵RGB,size=width*height*3/2
	 * @param width 图像宽度(必须为偶数)
	 * @param height 图像宽度(必须为偶数)
	 * @param output [out] 输出图像,size=width*height*3
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void NV212RGB(byte[]input , int width , int height , byte[]output);
	/**
	 * 将输入图像的色彩空间NV21转为BGR，输出到output
	 * @param input 输入图像矩阵BGR,width*height*3/2
	 * @param width 图像宽度(必须为偶数)
	 * @param height 图像宽度(必须为偶数)
	 * @param output [out] 输出图像,size=width*height*3
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void NV212BGR(byte[]input , int width , int height , byte[]output);
	/**
	 * 将输入图像的色彩空间NV21转为RGBA，输出到output
	 * @param input 输入图像矩阵BGR,width*height*3/2
	 * @param width 图像宽度(必须为偶数)
	 * @param height 图像宽度(必须为偶数)
	 * @param output [out] 输出图像,size=width*height*4
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void NV212RGBA(byte[]input , int width , int height , byte[]output);
	/**
	 * 将输入图像的色彩空间RGB转为NV21，输出到output
	 * @param input 输入图像矩阵RGB,size=width*height*3
	 * @param width 图像宽度(必须为偶数)
	 * @param height 图像宽度(必须为偶数)
	 * @param output [out] 输出图像,size=width*height*3/2
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void RGB2NV21(byte[]input, int width, int height, byte[]output);
	/**
	 * 将输入图像的色彩空间BGR转为NV21，输出到output
	 * @param input 输入图像矩阵RGB,size=width*height*3
	 * @param width 图像宽度(必须为偶数)
	 * @param height 图像宽度(必须为偶数)
	 * @param output [out] 输出图像,size=width*height*3/2
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void BGR2NV21(byte[]input, int width, int height, byte[]output);
	/**
	 * 将输入图像的色彩空间RGBA转为NV21，输出到output
	 * @param input 输入图像矩阵RGB,size=width*height*4
	 * @param width 图像宽度(必须为偶数)
	 * @param height 图像宽度(必须为偶数)
	 * @param output [out] 输出图像,size=width*height*3/2
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void RGBA2NV21(byte[]input, int width, int height, byte[]output);
	/**
	 * 将输入NV21格式图像旋转指定的角度<br>
	 * 图像必须是1字节对齐，多字节对齐的图像旋转可能会造成图像错位
	 * @param input 输入图像矩阵,size=width*height*3/2
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param angle 顺时针旋转角度(0,90,180,270)
	 * @throws NullPointerException
	 * @throws IllegalArgumentException
	 */
	abstract void nv21Rotate(byte[] input,int width,int height,int angle) ;
	/**
	 * NV21格式图像水平原地翻转(In-place)<br>
	 * 图像必须是1字节对齐，多字节对齐的图像旋转可能会造成图像错位
	 * @param input 输入图像矩阵,size=width*height*3/2
	 * @param width
	 * @param height
	 * @throws NullPointerException
	 * @throws IllegalArgumentException
	 */
	abstract void nv21Hflip(byte[] input,int width,int height) ;
	/**
	 * NV21格式图像垂直原地翻转(In-place)<br>
	 * 图像必须是1字节对齐，多字节对齐的图像旋转可能会造成图像错位
	 * @param input 输入图像矩阵,size=width*height*bpp
	 * @param width
	 * @param height
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	abstract void nv21Vflip(byte[] input,int width,int height) ;
}
